﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;
using SOAPClienteTarjetaService.Dominio;
using System.ServiceModel.Web;
using System.Messaging;

namespace SOAPClienteTarjetaService
{
    // NOTA: puede usar el comando "Rename" del menú "Refactorizar" para cambiar el nombre de clase "ClienteTarjetaService" en el código, en svc y en el archivo de configuración a la vez.
    public class ClienteTarjetaService : IClienteTarjetaService
    {

        public Dominio.Cliente ValidaCliente(int dni_)
        {
            ClienteMC ClienteLocal = new ClienteMC();
            Cliente cliente1 = new Cliente();
            wsReniecService.ReniecServiceClient proxyReniec = new wsReniecService.ReniecServiceClient();
            wsRipleyService.RipleyServiceClient proxyRipley = new wsRipleyService.RipleyServiceClient();

            try
            {
                //Si existe en RENIEC
                if (proxyReniec.ValidaPersona(dni_) == true)
                {
                    //Si existe en Base de Datos Riesgos Ripley
                    if (proxyRipley.ValidaCliente(dni_) == true)
                    {
                        wsRipleyService.Cliente clienteExiste = new wsRipleyService.Cliente();
                        clienteExiste = proxyRipley.ObtenerCliente(dni_);

                        ClienteLocal.dni = clienteExiste.dni;
                        ClienteLocal.nombre = clienteExiste.nombres;
                        ClienteLocal.apellidoPaterno = clienteExiste.apellidoPaterno;
                        ClienteLocal.apellidoMaterno = clienteExiste.apellidoMaterno;
                        ClienteLocal.direccion = clienteExiste.direccion;
                        ClienteLocal.lineaCredito = clienteExiste.lineaCredito;
                        ClienteLocal.tarjeta = clienteExiste.tarjeta;

                        try
                        {
                            string postdata = "{\"dni\":" + ClienteLocal.dni + ",\"nombre\":" + "\"" + ClienteLocal.nombre + "\"" + ",\"apellidoPaterno\":\"" + ClienteLocal.apellidoPaterno + "\"" + ",\"apellidoMaterno\":\"" + ClienteLocal.apellidoMaterno + "\",\"lineaCredito\":" + Convert.ToInt32(ClienteLocal.lineaCredito) + ",\"tarjeta\":\"" + ClienteLocal.tarjeta + "\"" + "}"; //JSON
                            byte[] data = Encoding.UTF8.GetBytes(postdata);
                            HttpWebRequest req = (HttpWebRequest)WebRequest
                                .Create("http://localhost:1414/ClientesMCService.svc/ClientesMC");
                            req.Method = "POST";
                            req.ContentLength = data.Length;
                            req.ContentType = "application/json";
                            var reqStream = req.GetRequestStream();
                            reqStream.Write(data, 0, data.Length);
                            var res = (HttpWebResponse)req.GetResponse();
                            StreamReader reader = new StreamReader(res.GetResponseStream());
                            string ClienteMCRipleyJson = reader.ReadToEnd();
                            JavaScriptSerializer js = new JavaScriptSerializer();
                            ClienteMC ClienteMC = js.Deserialize<ClienteMC>(ClienteMCRipleyJson);
                            //Enviamos a Verificar si  el cliente existe en ClienteMC
                            //esta verificación incluye el Registro del Cliente.
                        }
                        catch (WebException ex)
                        {
                            //Enviamos a Cola de Mensajes para el Posterior registro en Procesos MC

                            string rutaCola = @".\private$\ClientesMC";
                            if (!MessageQueue.Exists(rutaCola))
                                MessageQueue.Create(rutaCola);

                            MessageQueue cola = new MessageQueue(rutaCola);
                            Message mensaje = new Message();
                            mensaje.Label = "Nuevo Cliente";
                            mensaje.Body = new ClienteMC()
                            {
                                dni = clienteExiste.dni,
                                nombre = clienteExiste.nombres,
                                apellidoPaterno = clienteExiste.apellidoPaterno,
                                apellidoMaterno = clienteExiste.apellidoMaterno,
                                direccion = clienteExiste.direccion,
                                lineaCredito = clienteExiste.lineaCredito,
                                tarjeta = clienteExiste.tarjeta
                            };

                            cola.Send(mensaje);
                        }
                    }

                    cliente1.dni = ClienteLocal.dni;
                    cliente1.apellidoMaterno = ClienteLocal.apellidoMaterno;
                    cliente1.apellidoPaterno = ClienteLocal.apellidoPaterno;
                    cliente1.direccion = ClienteLocal.direccion;
                    cliente1.lineaCredito = ClienteLocal.lineaCredito;
                    cliente1.nombres = ClienteLocal.nombre;
                    cliente1.tarjeta = ClienteLocal.tarjeta;                   
                }

                return cliente1;

            }
            catch (Exception ex)
            {
                throw ex;
            }            
        }
    }
}

